//=========================================================================
// 菜单组件（navigation）
// =========================================================================
/*
|  方法名称						| 描述							| 参数
|===============================================================================================================================================================================================|
|  01. options					| 获取组件参数					| 无																															|
|  02. setHeaderImg				| 设置头像						| imagePath（图片URL）																											|	
|  03. getHeaderImg				| 获取头像URL					| 无																															|
|  04. setHeaderState			| 设置头部用户状态样式			| state（状态样式名称，可选值：online,offline,away,busy）																		|
|  05. getHeaderState			| 获取头部用户状态样式			| 无																															|
|  06. setHeaderTitle			| 设置头部标题					| title（标题，默认格式为：你好, <span>管理员</span>）																			|
|  07. getHeaderTitle			| 获取头部标题					| 无																															|
|  08. setHeaderSubTile			| 设置头部子标题				| subTitle（子标题）																											|
|  09. getHeaderSubTile			| 获取头部子标题				| 无																															|
|  10. loadData					| 加载菜单JSON数据				| menuData（菜单JSON数据，格式请看/static/showcase/menu_data.js）																|
|  11. getData					| 获取菜单JSON数据				| 无																															|
|  12. loadFromUrl				| 从URL加载数据					| url（菜单数据URL）																											|
|  13. addBadge					| 添加徽章						| badgeData（徽章数据，格式为：{menuId:'菜单项ID', type: 'default', shape: 'circle', rounded: true, stroke: false, text: ''}）	|
|  14. setSidebarColor			| 设置菜单颜色					| classname（菜单颜色样式名称）																									|
|  15. getSidebarColor			| 获取菜单颜色					| 无																															|
|  16. handleSidebarResponsive	| 设置菜单滚动条和高度			| 无																															|
|  17. setMenuShape				| 设置菜单按钮形状				| menuShape（按钮形状样式名称，可选值：sidebar-circle,sidebar-rounded,sidebar-box）												|
|===============================================================================================================================================================================================|

|  参数名称						| 类型							| 描述
|===============================================================================================================================================================================================|
|  menuIconShapeDefault			| array							| 菜单图标类型可选值（内部使用，不需要用户设置）																				|
|  headerStateDefault			| array							| 用户在线状态可选值（内部使用，不需要用户设置）																				|
|  sidebarHeader				| object						| 头部人员信息参数																												|
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|  src							| string						| 头像点击以后跳转URL																											|
|  imgPath						| string						| 头像图片URL																													|
|  headerState					| string						| 在线状态，可选值：online,offline,away,busy																					|
|  title						| string						| 标题																															|
|  subTitle						| string						| 副标题																														|
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|  sidebarMenu					| object						| 菜单项参数																													|
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|  sidebarMenuData				| object						| 菜单JSON数据																													|
|  menuUrl						| string						| 菜单数据远程加载URL																											|
|  menuIconShape				| string						| 图标形状																														|
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|  siderbarFooter				| array							| 菜单底部按钮（格式为：[{id:'', tooltip:'', icon:''}]）																		|
|===============================================================================================================================================================================================|
*/
(function($){
	// =========================================================================
    // 私有方法：生成菜单HTML代码
    // =========================================================================
	function make_menu_html(container, menu_data) {
		// 菜单容器
		var $menuContainer = $(container).find('.sidebar-menu');
		// 配置信息
		var state = $.data(container, 'navigation');
		var menuItemClick = state.options.onMenuItemClick;
		// 清理容器
		$menuContainer.html('');
		// 是否使用iframe
		var iframeId = state.options.iframe !== null ? " target = '" + state.options.iframe + "'" : '';
		
		for(var i = 0; i < menu_data.length; i++) {
			
			// 菜单数据
			if(menu_data[i]) {
				// 一级菜单
				var topMenuChildren = menu_data[i].children;
				var topMenuHasChild = topMenuChildren.length > 0 ? true : false;
				var topMenuSrc = menu_data[i].src ? menu_data[i].src : 'javascript:void(0);';
				var topMenuId = menu_data[i].id;
				var topMenuName = menu_data[i].name;
				var topMenuIcon = menu_data[i].icon;
				var topMenuActive = menu_data[i].active;
				var topMenuHTML = _get_top_menu_html(topMenuId, topMenuName, topMenuIcon, topMenuSrc, topMenuHasChild, topMenuActive, iframeId);
				// 生成一级菜单
				$menuContainer.append(topMenuHTML);
				
				// 是否有二级菜单
				if(topMenuChildren) {
					
					// 生子二级菜单
					for(var j = 0; j < topMenuChildren.length; j++) {
						var submenu_id = _newGuid();
						$menuContainer.append('<li class="submenu" id="' + submenu_id + '"></li>');
						var menu = $menuContainer.find('#' + submenu_id);
						
						var name = topMenuChildren[j].name;
						var icon = topMenuChildren[j].icon;
						var hasChild = topMenuChildren[j].children && topMenuChildren[j].children.length > 0 ? true : false;
						var src = topMenuChildren[j].src ? topMenuChildren[j].src : 'javascript:void(0);';
						var id = topMenuChildren[j].id;
						
						// 二级菜单
						var html = 
							'<a href="' + src + '" id="' + id + '"' + iframeId + '>'+
		                        '<span class="icon"><i class="' + icon + '"></i></span>'+
		                        '<span class="text"> ' + name + '</span>'+
		                        (hasChild ? '<span class="arrow"></span>' : '')+
		                    '</a>';
						
						menu.append(html);
						
						if(hasChild == false) {
							// 绑定事件
							menu.find('a').eq(0).data('menuItemData', topMenuChildren[j]);
							if(menuItemClick) {
								menu.find('a').eq(0).on('click',  function() {
									
									// 清除所有已选项
									var topElement = $(this).parents('.sidebar-menu');
									topElement.find('.active').removeClass('active');
									topElement.find('.selected').remove();
									
									$(this).parent().addClass('active');
									$(this).append('<span class="selected"></span>');
									
									return menuItemClick($(this).data('menuItemData'));
								});
							}
						}
						
					    if(hasChild) {
					    	var sub_menu_data = topMenuChildren[j].children;
					    	
					    	if(sub_menu_data && sub_menu_data.length > 0) {
					    		menu.append('<ul>\n</ul>\n');
					    	}
					    	
					    	for(var k = 0; k < sub_menu_data.length; k++) {
					    		var sub_menu_name = sub_menu_data[k].name;
					    		var sub_menu_src = sub_menu_data[k].src ? sub_menu_data[k].src : 'javascript:void(0);';
					    		var sub_menu_id = sub_menu_data[k].id;
					    		
					    		var html = '';
								html += '<li><a href="' + sub_menu_src + '" id="' + sub_menu_id + '" ' + iframeId + '>' + sub_menu_name + '</a></li>\n';
								
								menu.find('ul').eq(0).append(html);
						    	menu.find('#' + sub_menu_id).data('menuItemData', sub_menu_data[k]);
						    	if(menuItemClick) {
						    		// 绑定事件
									menu.find('#' + sub_menu_id).on('click',  function() {
										// 清除所有已选项
										var topElement = $(this).parents('.sidebar-menu');
										topElement.find('.active').removeClass('active');
										topElement.find('.selected').remove();
										
										var parentElement = $(this).parents('.submenu');
										
										parentElement.addClass('active');
										parentElement.find('a').eq(0).append('<span class="selected"></span>');
										
										return menuItemClick($(this).data('menuItemData'));
									});
						    	}
							}
					    }
					}
				}
			}
		}
		
		// 设置动画效果
		_handleSidebarNavigation(container);
		// 设置滚动条
		_checkHeightSidebar(container);
		// 展开当前页面对应的菜单项
		_selectMenuItem(container);
	}
	
	// =========================================================================
    // 私有方法：生成一级菜单
    // =========================================================================
	function _get_top_menu_html(_id, _name, _icon, _src, _hasChild, _active, _iframeId) {
		if(_hasChild == false) {
			var html = 
				'<li'+ (_active ? ' class="active"' : '') + '>' + 
					'<a href="' + _src + '" id="' + _id + '"' + _iframeId + '>'+
		                '<span class="icon"><i class="' + _icon + '"></i></span>'+
		                '<span class="text">' + _name + '</span>'+
		                (_active ? '<span class="selected"></span>' : '') + 
		            '</a>'+
			    '</li>';
			return html;
		}else {
			var html = 
				'<li class="sidebar-category">' + 
			        '<span>' + _name + '</span>'+
			        '<span class="pull-right"><i class="' + _icon + '"></i></span>'+
			    '</li>';
			return html;
		}
	}
	
	// =========================================================================
    // 私有方法：生成组件内部元素ID
    // =========================================================================
	function _newGuid(){
	    var guid = "";
	    for (var i=1; i<=32; i++){
	        var n = Math.floor(Math.random()*16.0).toString(16);
	        guid +=   n;
	        if((i==8)||(i==12)||(i==16)||(i==20))
	            guid += "";
	    }
	    return guid.toUpperCase();
	}
	
	// =========================================================================
    // 私有方法：设置组件点击效果
    // =========================================================================
	function _handleSidebarNavigation(container) {
		$(container).find('li > a').click(function() {
			// 保存当前菜单项ID
            $.cookie('selectedMenuID', $(this).attr('id'));
            
            var parentElement = $(this).parent(),
                nextElement = $(this).nextAll(),
                arrowIcon = $(this).find('.arrow'),
                plusIcon = $(this).find('.plus');
            
            if(parentElement.parent('ul').find('ul:visible')){
                parentElement.parent('ul').find('ul:visible').slideUp('fast');
                parentElement.parent('ul').find('.open').removeClass('open');
            }
            
            if(nextElement.is('ul:visible')) {
                arrowIcon.removeClass('open');
                plusIcon.removeClass('open');
                nextElement.slideUp('fast');
                arrowIcon.removeClass('fa-angle-double-down').addClass('fa-angle-double-right');
            }
            
            if(!nextElement.is('ul:visible')) {
                arrowIcon.addClass('open');
                plusIcon.addClass('open');
                nextElement.slideDown('fast');
                arrowIcon.removeClass('fa-angle-double-right').addClass('fa-angle-double-down');
            }
            
            var parentSubmenu = $(this).parent('li').parent('ul').parent('li.submenu');
            
            if(parentSubmenu.size() > 0 && parentSubmenu.find('a > .arrow').size() > 0) {
                // 设置菜单样式
                $(container).find('.submenu > ul > li.active').removeClass('active');
                $(this).parent().addClass('active');
                // 设置二级菜单样式
                if(parentSubmenu.hasClass('active') == false) {
                	$(container).find('span.selected').remove();
        			$(container).find('li.active').removeClass('active');
        			
        			parentSubmenu.addClass('active');
        			parentSubmenu.find('a').eq(0).append('<span class="selected"></span>');
                }
            }
            
            var parentSidebarMenu = $(this).parent('li').parent('ul.sidebar-menu');
            
            if(parentSidebarMenu.size() > 0) {
            	$(container).find('li.active').removeClass('active');
            	$(this).parent().addClass('active');
            }
        });
	}
	
	// =========================================================================
    // 私有方法：自动选中当前页面对应的菜单项
    // =========================================================================
	function _selectMenuItem(container) {
		var selectedMenuID = $.cookie('selectedMenuID');
		var state = $.data(container, 'navigation');
		
		if(selectedMenuID != null && $(container).find("#" + selectedMenuID).size() > 0) {
			$(container).find('span.selected').remove();
			$(container).find('li.active').removeClass('active');
			
			var menuItem = $(container).find("#" + selectedMenuID);
			
			if(menuItem.parent('li').hasClass('submenu') == false) {
				menuItem.parent('li').addClass('active');
				menuItem.parents('li.submenu').find('a').eq(0).append('<span class="selected"></span>');
				menuItem.parents('li.submenu').addClass('active');
			}else {
				menuItem.append('<span class="selected"></span>');
				menuItem.parent('li').addClass('active');
			}
			
			if(state.options.iframe !== null) {
				$("#" + state.options.iframe).attr('src', menuItem.attr('href'));
			}
		}else if(selectedMenuID == null && state.options.iframe !== null) {
			var sidebarMenu = state.options.sidebarMenu.sidebarMenuData;
			$("#" + state.options.iframe).attr('src', sidebarMenu[0].src);
		}
	}
	
	// =========================================================================
    // 私有方法：设置组件高度和niceScroll滚动条
    // =========================================================================
	function _checkHeightSidebar(container) {
		// Optimalisation: Store the references outside the event handler:
        function checkHeightSidebar() {
            // Check if there is class page-sidebar-fixed
            if($('.page-sidebar-fixed').length){
                // Setting dinamic height sidebar menu
                var heightSidebarLeft       = $(window).outerHeight() - $('#header').outerHeight() - $('.sidebar-footer').outerHeight() - $('.sidebar-content').outerHeight();

                $('#sidebar-left .sidebar-menu').height(heightSidebarLeft).niceScroll({
                    cursorwidth: '10px',
                    cursorborder: '0px',
                    railalign: 'left'
                });
            }

        	var heightSidebarRight = $(window).outerHeight() - $('#sidebar-right .panel-heading').outerHeight();
        	
            // Sidebar right profile
            $('#sidebar-profile .sidebar-menu').height(heightSidebarRight).niceScroll({
                cursorwidth: '10px',
                cursorborder: '0px'
            });

            // Sidebar right layout
            $('#sidebar-layout .sidebar-menu').height(heightSidebarRight).niceScroll({
                cursorwidth: '10px',
                cursorborder: '0px'
            });

            // Sidebar right setting
            $('#sidebar-setting .sidebar-menu').height(heightSidebarRight).niceScroll({
                cursorwidth: '10px',
                cursorborder: '0px'
            });
        }
        
        // Execute on load
        checkHeightSidebar();
        // Bind event listener
        $(window).resize(checkHeightSidebar);
	}
	
	// =========================================================================
    // 私有方法：组件初始化
    // =========================================================================
	function init(container){
		// 判断UI.ROOT_PATH是否为空
		if(UI.ROOT_PATH === '') {
			// 初始化根路径
			UI.ROOT_PATH = UI.handleBaseURL();
		}
		// 读取配置信息
		var state = $.data(container, 'navigation');
		// 读取头部配置信息
		var sidebarHeader = state.options.sidebarHeader;
		// 读取菜单数据
		var sidebarMenu = state.options.sidebarMenu;
		// 读取底部按钮数据
		var siderbarFooter = state.options.siderbarFooter;
		
		// 设置图标整体样式（'rounded','circle','box'）
		$(container).attr('class', '');
		$(container).removeClass();
		if(sidebarMenu.menuIconShape != 'default') {
			var menuIconShape = $.inArray(sidebarMenu.menuIconShape, state.options.menuIconShapeDefault) ? sidebarMenu.menuIconShape : state.options.menuIconShapeDefault[0];
			$(container).addClass(menuIconShape);
		}
		
		// 生成头部用户信息
		if(sidebarHeader) {
			var sidebarHeaderHtml = '<div class="media">'+
										'<a class="pull-left has-notif avatar" href="' + sidebarHeader.src + '">'+
											'<img src="' + sidebarHeader.imgPath + '" alt="admin">'+
											'<i class="' + sidebarHeader.headerState + '"></i>'+
										'</a>'+
										'<div class="media-body">'+
											'<h4 class="media-heading">' + sidebarHeader.title + '</h4>'+
											'<small>' + sidebarHeader.subTitle + '</small>'+
										'</div>'+
									'</div>';
			
			$(container).find('.sidebar-content').html(sidebarHeaderHtml);
		}
		
		// 生成菜单
		if(sidebarMenu) {
			
			if((!sidebarMenu.sidebarMenuData || sidebarMenu.sidebarMenuData.length == 0) && sidebarMenu.menuUrl != '' && sidebarMenu.menuUrl.indexOf(".json") > -1) {
				// 远程加载JSON数据
				$.ajax({
				    url: sidebarMenu.menuUrl,
				    type: "GET",
				    dataType: "JSON",
				    success: function(data) {
						// 生成HTML代码
				    	sidebarMenu.sidebarMenuData = menu_data;
						make_menu_html(container, sidebarMenu.sidebarMenuData);
				    }
				});
			}else if((!sidebarMenu.sidebarMenuData || sidebarMenu.sidebarMenuData.length == 0) && sidebarMenu.menuUrl != '' && sidebarMenu.menuUrl.indexOf(".js") > -1) {
				// 远程加载JS文件（菜单数据变量名为：menu_data）
				var head = $("head").remove("script[role='reload']");
	            $("<scri" + "pt>" + "</scr" + "ipt>").attr({ role: 'reload', src: sidebarMenu.menuUrl, type: 'text/javascript' }).appendTo(head);
	            sidebarMenu.sidebarMenuData = menu_data;
	            make_menu_html(container, sidebarMenu.sidebarMenuData);
			}else {
				// 生成HTML代码
				make_menu_html(container, sidebarMenu.sidebarMenuData);
			}
		}
		
		// 生成底部按钮
		if(siderbarFooter && siderbarFooter.length > 0) {
			var $footerObj = $(container).find('.sidebar-footer');
			$footerObj.html('');
			
			for(var i = 0; i < siderbarFooter.length; i++) {
				var button = siderbarFooter[i];
				
				var buttonHtml = '<a id="' + button.id + '" class="pull-left" href="javascript:void(0);" data-toggle="tooltip" data-placement="top" data-title="' + button.tooltip + '" data-original-title="" title=""><i class="' + button.icon + '"></i></a>';
				$footerObj.append(buttonHtml);
			}
		}
		
		if($('[data-toggle=tooltip]').length){
            $('[data-toggle=tooltip]').tooltip({
                animation: 'fade'
            });
        }
	}
	
	// =========================================================================
    // 组件入口
    // =========================================================================
	$.fn.navigation = function(options, param){
		if (typeof options == 'string'){
			return $.fn.navigation.methods[options](this, param);
		}
		
		options = options || {};
		
		return this.each(function(){
			var state = $.data(this, 'navigation');
			if (state){
				$.extend(state.options, options);
			} else {
				$.data(this, 'navigation', {
					options: $.extend(true, {}, $.fn.navigation.defaults, options)
				});
			}
			
			// 初始化组件
			init(this);
		});
	};
	
	// =========================================================================
    // 组件默认参数
    // =========================================================================
	$.fn.navigation.defaults = {
		menuIconShapeDefault:['', 'sidebar-circle','sidebar-rounded','sidebar-box'],
		headerStateDefault:['online','offline','away','busy'],			// 头部用户状态
		iframe:null,													// 是否使用iFrame
		sidebarHeader:{													// 头部配置信息
			src: 'javascript:void(0);',									// 头像跳转链接 
			imgPath:'',													// 头像图片地址
			headerState:'offline',										// 用状态图标样式
			title:'',													// 标题
			subTitle:''													// 小标题
		},
		sidebarMenu:{													// 菜单配置信息
			sidebarMenuData:[],											// 默认菜单数据
			menuUrl:'',													// 菜单数据加载URL
			menuIconShape:'sidebar-circle'								// 菜单图标形状
		},
		siderbarFooter:[]												// 底部按钮
	};
	
	// =========================================================================
    // 组件公共方法
    // =========================================================================
	$.fn.navigation.methods = {
		options: function(jq, param){
			var state = $.extend({}, $.fn.navigation.defaults, $.data(jq[0], 'navigation').options, param);
			return state;
		},
		setHeaderImg: function(container, imagePath) {
			var headerImg = $(container).find('.media > .avatar');
			if(imagePath != undefined && imagePath !== '') {
				headerImg.find('img').remove();
				headerImg.append('<img src="' + imagePath + '" />');
			}
		},
		getHeaderImg: function(container) {
			return headerImg = $(container).find('.media > .avatar > img').attr('src');
		},
		setHeaderState: function(container, state) {
			$(container).find('.media > .avatar > i').attr('class', state);
		},
		getHeaderState: function(container) {
			return $(container).find('.media > .avatar > i').attr('class');
		},
		setHeaderTitle: function(container, title) {
			$(container).find('.media .media-heading').html(title);
		},
		getHeaderTitle: function(container) {
			return $(container).find('.media .media-heading').html();
		},
		setHeaderSubTile: function(container, subTitle) {
			$(container).find('.media > .media-body > small').html(subTitle);
		},
		getHeaderSubTile: function(container) {
			return $(container).find('.media > .media-body > small').html();
		},
		loadData: function(container, menuData) {
			var opts = $(container).navigation('options', {});
			opts.sidebarMenu.menuUrl = "";
			opts.sidebarMenu.sidebarMenuData = menuData;
			$(container).navigation(opts);
		},
		getData: function(container) {
			var opts = $(container).navigation('options', {});
			return opts.sidebarMenu.sidebarMenuData;
		},
		loadFromUrl: function(container, url) {
			var opts = $(container).navigation('options', {});
			opts.sidebarMenu.menuUrl = url;
			opts.sidebarMenu.sidebarMenuData = [];
			$(container).navigation(opts);
		},
		setMenuShape: function(container, menuShape) {
			var opts = $(container).navigation('options', {});
			var menuIconShape = $.inArray(menuShape, opts.menuIconShapeDefault) ? menuShape : opts.menuIconShapeDefault[0];
			$(container).removeClass().addClass(menuIconShape);
		},
		addBadge: function(container, badgeData) {
			var defaultBadgeData = {
				type: 'default',
				shape: 'circle',
				rounded: true,
				stroke: false,
				text: ''
			};
			
			var menuId = badgeData.menuId;
			var opts = $.extend({}, defaultBadgeData, badgeData);
			
			if(menuId == undefined || menuId == '' || $(container).find('#' + menuId).size() == 0) {
				return;
			}
			
			var html = '<span class="label label-' + opts.type + ' pull-right ' + (opts.rounded === true ? 'rounded' : '') + ' ' + (opts.stroke === true ? 'label-stroke' : '') + '">' + opts.text + '</span>';
			$(container).find('#' + menuId).append(html);
		},
		setSidebarColor: function(container, classname) {
			// Check variant sidebar class
            if($(container).hasClass('sidebar-box')){
                $(container).attr('class','sidebar-box sidebar-'+classname);
            }
            else if($(container).hasClass('sidebar-rounded')){
                $(container).attr('class','sidebar-rounded sidebar-'+classname);
            }
            else if($(container).hasClass('sidebar-circle')){
                $(container).attr('class','sidebar-circle sidebar-'+classname);
            }
            else if($(container).attr('class') == ''){
                $(container).attr('class','sidebar-'+classname);
            }
            // Set cookie theme name value to variable classname
            $.cookie('sidebar_color',classname, {expires: 1});
		},
		getSidebarColor: function(container) {
			var classname = $(container).attr('class');
			var all_color = ['dark','light','primary','success','info','warning','danger'];
			
			for(var i = 0; i < all_color.length; i++) {
				if(classname.indexOf('sidebar-' + all_color[i]) > -1) {
					return all_color[i];
				}
			}
		},
		handleSidebarResponsive:function(){
        	// Optimalisation: Store the references outside the event handler:
        	var $window = $(window);
        	function checkWidth() {
        		var windowsize = $window.width();
        		// Check if view screen on greater then 720px and smaller then
        		// 1024px
        		if (windowsize > 768 && windowsize <= 1024) {
        			$('body').addClass('page-sidebar-minimize-auto');
        		} else if (windowsize <= 768) {
        			$('body').removeClass('page-sidebar-minimize');
        			$('body').removeClass('page-sidebar-minimize-auto');
        		} else {
        			$('body').removeClass('page-sidebar-minimize-auto');
        		}
        	}
        	// Execute on load
        	checkWidth();
        	// Bind event listener
        	$(window).resize(checkWidth);

        	// When the minimize trigger is clicked
        	$('.navbar-minimize a').on('click', function() {
        		// Check class sidebar right show
        		if ($('.page-sidebar-right-show').length) {
        			$('body').removeClass('page-sidebar-right-show');
        		}
        		// Check class sidebar minimize auto
        		if ($('.page-sidebar-minimize-auto').length) {
        			$('body').removeClass('page-sidebar-minimize-auto');
        		} else {
        			// Toggle the class to the body
        			$('body').toggleClass('page-sidebar-minimize');
        		}
        		// Check the current cookie value
        		// If the cookie is empty or set to not active, then add
        		// page_sidebar_minimize
        		if ($.cookie('page_sidebar_minimize') == "undefined"
        				|| $.cookie('page_sidebar_minimize') == "not_active") {

        			// Set cookie value to active
        			$.cookie('page_sidebar_minimize', 'active', {
        				expires : 1
        			});
        		}
        		// If the cookie was already set to active then remove it
        		else {
        			// Remove cookie with name page_sidebar_minimize
        			$.removeCookie('page_sidebar_minimize');
        			// Create cookie with value to not_active
        			$.cookie('page_sidebar_minimize', 'not_active', {
        				expires : 1
        			});
        		}
        	});

        	$('.navbar-setting a').on('click', function() {
        		if ($('.page-sidebar-minimize.page-sidebar-right-show').length) {
        			$('body').toggleClass('page-sidebar-minimize page-sidebar-right-show');
        		} else if ($('.page-sidebar-minimize').length) {
        			$('body').toggleClass('page-sidebar-right-show');
        		} else {
        			$('body').toggleClass('page-sidebar-minimize page-sidebar-right-show');
        		}
        	});

        	// This action available on mobile view
        	$('.navbar-minimize-mobile.left').on('click', function() {
        		if ($('body.page-sidebar-right-show').length) {
        			$('body').removeClass('page-sidebar-right-show');
        			$('body').removeClass('page-sidebar-minimize');
        		}
        		$('body').toggleClass('page-sidebar-left-show');
        	});
        	
        	$('.navbar-minimize-mobile.right').on('click', function() {
        		if ($('body.page-sidebar-left-show').length) {
        			$('body').removeClass('page-sidebar-left-show');
        			$('body').removeClass('page-sidebar-minimize');
        		}
        		$('body').toggleClass('page-sidebar-right-show');
        	});
        }
	};
})(jQuery);

//=========================================================================
// 通知提醒组件（notification）
// =========================================================================
/*
|  方法名称								| 描述							| 参数
|=======================================================================================================================================================================================================|
|  01. $.notification.alert				| alert通知框					| options（对话框参数，具体参数请看下面参数表）														                			|
|  02. $.notification.success			| success通知框					| options（对话框参数，具体参数请看下面参数表）														            				|
|  03. $.notification.error				| error通知框					| options（对话框参数，具体参数请看下面参数表）														                			|
|  04. $.notification.warning			| warning通知框					| options（对话框参数，具体参数请看下面参数表）														            				|
|  05. $.notification.information		| information通知框				| options（对话框参数，具体参数请看下面参数表）														            				|
|  06. $.notification.confirm			| confirm待确认按钮通知框		| options（对话框参数，具体参数请看下面参数表）														                   			|
|=======================================================================================================================================================================================================|

|  参数名称						| 类型							| 描述
|=======================================================================================================================================================================================================|
|  title						| string						| 标题																																	|
|  subtitle						| string						| 副标题																									    						|
|  layout						| string						| 显示位置（可选值：top, topLeft, topCenter, topRight, center, centerLeft, centerRight, bottom, bottomLeft, bottomCenter, bottomRight）	|
|  theme						| string						| 主题（可选值：alert,success,error,error,information,information，默认不用设置）							            				|
|  timeout						| string						| 自动隐藏时间（false为不自动隐藏，正整数为多少毫秒以后自动隐藏）                                                                       |                                                                                                                     
|=======================================================================================================================================================================================================|
*/
$.notification = function(options) {
	// 自定义属性
	var customOptions = $.extend(true, {}, $.noty.defaults, {
		title: '&nbsp;',
		subtitle: '&nbsp;',
		layout: 'top',
		theme: 'relax',
	    timeout: false
	}, options);
	
	// 是否显示图标
	if(customOptions.icon === true) {
		customOptions.text = $.notification.template.replace('{text}', customOptions.text);
		customOptions.text = customOptions.text.replace('{icon}', customOptions.iconClass);
		customOptions.text = customOptions.text.replace('{typeClass}', customOptions.typeClass);
		customOptions.text = customOptions.text.replace('{title}', customOptions.title);
		customOptions.text = customOptions.text.replace('{subtitle}', customOptions.subtitle);
	}
	
	if(customOptions.type === 'confirm') {
		
		var buttons = new Array();
		
		// 添加 确定 按钮
		if(customOptions.ok === true) {
			buttons.push({addClass: 'btn ' + customOptions.okClass, text: customOptions.okText, onClick: function($noty) {
					customOptions.okClick($noty);
  				}
			});
		}
		// 添加 取消 按钮
		if(customOptions.cancel === true) {
			buttons.push({addClass: 'btn ' + customOptions.cancelClass, text: customOptions.cancelText, onClick: function($noty) {
					customOptions.cancelClick($noty);
  				}
			});
		}
		// 添加其它自定义按钮
		for(var i = 0; i < customOptions.customButtons.length; i ++) {
			var button = customOptions.customButtons[i];
			
			buttons.push({addClass: 'btn ' + button.cssClass, text: button.text, onClick: function($noty) {
					button.click($noty);
				}
			});
		}
		
		customOptions.buttons = buttons;
	}
	
	noty(customOptions);
};

$.notification.template = '<div class="alert {typeClass}" style="text-align:left;margin-bottom:0;">'+
    '<span class="alert-icon"><i class="fa {icon}"></i></span>'+
    '<div class="notification-info">'+
        '<ul class="clearfix notification-meta">'+
            '<li class="pull-left notification-sender">{title} </li>'+
            '<li class="pull-right notification-time">{subtitle}</li>'+
        '</ul>'+
        '<p>{text}</p>'+
    '</div>'+
'</div>';


$.notification.alert = function(options){
	var customOptions = {
	    type: 'alert',
	    typeClass: 'alert-default',
	    iconClass: 'fa-info-circle'
	};
	
	$.notification($.extend(true, {}, options, customOptions));
};

$.notification.success = function(options){
	var customOptions = {
	    type: 'success',
	    typeClass: 'alert-success',
	    iconClass: 'fa-check'
	};
	
	$.notification($.extend(true, {}, options, customOptions));
};
$.notification.error = function(options){
	var customOptions = {
	    type: 'error',
	    typeClass: 'alert-danger',
	    iconClass: 'fa-times-circle'
	};
	
	$.notification($.extend(true, {}, options, customOptions));
};
$.notification.warning = function(options){
	var customOptions = {
	    type: 'warning',
	    typeClass: 'alert-warning',
	    iconClass: 'fa-exclamation-circle'
	};
	
	$.notification($.extend(true, {}, options, customOptions));
};
$.notification.information = function(options){
	var customOptions = {
	    type: 'information',
	    typeClass: 'alert-info',
	    iconClass: 'fa-info-circle'
	};
	
	$.notification($.extend(true, {}, options, customOptions));
};
$.notification.confirm = function(options){
	var customOptions = {
	    type: 'confirm',
	    typeClass: 'alert-default',
	    iconClass: 'fa-question-circle',
	    ok: true,
	    okClass: 'btn-primary',
	    okText: '确定',
//	    okClick: function($noty) {
//	    	$noty.close();
//	    },
	    cancel: true,
	    cancelClass: 'btn-danger',
	    cancelText: '取消',
	    cancelClick: function($noty) {
	    	$noty.close();
	    },
	    customButtons:[]
	};
	
	$.notification($.extend(true, {}, options, customOptions));
};


//=========================================================================
// 对话框组件
// @author Abdiweli 2015-09-18
// =========================================================================
/*
|  方法名称						| 描述							| 参数
|===========================================================================================================================================================================|
|  01. $.dialog.alert			| Alert提示信息框				| options（对话框参数，具体参数请看下面参数表）																|
|  02. $.dialog.confirm			| Confirm确认框					| options（对话框参数，具体参数请看下面参数表）																|	
|===========================================================================================================================================================================|

|  参数名称						| 类型							| 描述
|===========================================================================================================================================================================|
|  dialogType					| string						| 对话框类型（可选值：default,primary,success,info,warning,danger,lilac,teal，默认值：primary）				|
|  dialogSize					| string						| 对话框大小（可选值：sm,lg，默认值：sm）																	|
|  verticalAlign				| string						| 对话框垂直位置（例如：50%，默认值：10%）																	|
|  title						| string						| 对话框标题																								|
|  content						| string						| 对话框内容，可以是HTML代码																				|
|  okVal						| string						| 默认确定按钮文字																							|
|  okClass						| string						| 默认确定按钮样式，如不设置、则沿用对话框样式																|
|  cancelVal					| string						| 默认取消按钮文字																							|
|  cancelClass					| string						| 默认取消按钮样式，如不设置、则沿用对话框样式																|
|  scrollable					| string						| 内容是否出现滚动条																						|
|  ok							| object						| 默认确定按钮函数																							|
|  cancel						| object						| 默认取消按钮函数																							|
|  button						| array 						| 自定义按钮数组（格式为：[{title:'按钮文字',type:'类型（参考对话框类型参数）',click:'点击事件'}]）			|
|===========================================================================================================================================================================|
*/
(function($){
	var _componentName = 'dialog';
	
	function create(jq) {
		// 获取传入的参数
		var state = $.data(jq, _componentName);
		var opts = state.options;
		
		// 获取对话框的jQuery对象
		$dialogObj = $(jq);
		
		// 设置对话框样式
		$dialogObj.addClass('modal-' + opts.dialogType);
		$dialogObj.find('.modal-dialog').addClass('modal-' + opts.dialogSize);
		$dialogObj.find('.modal-title').html(opts.title);
		
		if(opts.scrollable === true) {
			$dialogObj.find('.modal-body .panel-body').html(opts.content);
		}else {
			$dialogObj.find('.modal-body .panel-body').remove();
			$dialogObj.find('.modal-body').html('<p>' + opts.content + '</p>');
		}
		
		if(opts.verticalAlign != '') {
			$dialogObj.css('top', opts.verticalAlign);
		}
		
		// 设置自定义按钮
		for(var i = 0; i < opts.button.length; i++) {
			var $modalFooter = $dialogObj.find('.modal-footer');
			var title = opts.button[i].title;
			var click = opts.button[i].click;
			var type = opts.button[i].type;
			
			$modalFooter.prepend('<button type="button" class="btn">' + title + '</button>');
			$button = $modalFooter.find('button').eq(0);
			
			if(type) {
				$button.addClass('btn-' + type);
			}else {
				$button.addClass('btn-default');
			}
			if(click) {
				$button.bind('click', function() {
					click(jq, opts);
				});
			}else {
				$button.bind('click', function() {
					$(jq).modal('hide');
				});
			}
		}
		
		
		// 显示对话框
		$dialogObj.modal({backdrop:'static'});
		
		if(opts.scrollable === true) {
			// 加入滚动条
			$dialogObj.find('.panel-scrollable .panel-body').niceScroll({
	            cursorwidth: '10px',
	            cursorborder: '0px'
	        });
		}
		
		return $dialogObj;
	}
	
	$.fn.dialog = function(options, param){
		if (typeof options == 'string'){
			var method = $.fn.dialog.methods[options];
			if (method){
				return method(this, param);
			} else {
				return this.dialog(options, param);
			}
		}
		
		options = options || {};
		return this.each(function(){
			var state = $.data(this, _componentName);
			if (state){
				$.extend(state.options, options);
			} else {
				state = $.data(this, _componentName, {
					options: $.extend({}, $.fn.dialog.defaults, options),
					data: []
				});
			}
			
			create(this);
		});
	};
	
	$.fn.dialog.methods = {
		options: function(jq, param){
			// 默认参数与传入的参数合并
			var state = $.extend({}, $.fn.dialog.defaults, param);
			return state;
		},
		hide: function(jq) {
			$(jq).modal('hide');
		},
		alert: function(jq, param) {
			// 显示Alert提示框
			var $dialogObj = $(jq);
			var opts = $(jq).dialog('options', param);
			var okBtnClass = opts.okClass != '' ? opts.okClass : opts.dialogType;
			
			$dialogObj.find('button[role=ok]').addClass('btn-' + okBtnClass).html(opts.okVal).unbind('click').bind('click', function() {
				$(jq).modal('hide');
				return opts.ok(jq, param);
			});
			
			$dialogObj.dialog(opts);
		},
		confirm: function(jq, param) {
			// 显示Alert提示框
			var $dialogObj = $(jq);
			var opts = $(jq).dialog('options', param);
			var okBtnClass = opts.okClass != '' ? opts.okClass : opts.dialogType;
			var cancelBtnClass = opts.cancelClass != '' ? opts.cancelClass : opts.dialogType;
			
			$dialogObj.find('button[role=ok]').addClass('btn-' + okBtnClass).html(opts.okVal).unbind('click').bind('click', function() {
				$(jq).modal('hide');
				return opts.ok(jq, param);
			});
			$dialogObj.find('button[role=cancel]').addClass('btn-' + cancelBtnClass).html(opts.cancelVal).unbind('click').bind('click', function() {
				$(jq).modal('hide');
				return opts.cancel(jq, param);
			});
			
			$dialogObj.dialog(opts);
		}
	};
	
	$.fn.dialog.defaults = {
		dialogType: 'primary',
		dialogSize: 'sm',
		verticalAlign: '10%',
		title:'提示',
		content:'这是一个对话框！',
		okVal: '确定',
		okClass: '',
		cancelVal: '取消',
		cancelClass: 'default',
		scrollable: false,
		ok:function(jq, options){
			$(jq).modal('hide');
		},
		cancel:function(jq, options){
			$(jq).modal('hide');
		},
		button:[]
	};
})(jQuery);
$.dialog = function(options) {
	$("<div></div>").dialog(options);
};
$.dialog.msghtml = 
	'<div class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">'+
		'<div class="modal-dialog">'+
			'<div class="modal-content">'+
			    '<div class="modal-header">'+
			        '<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>'+
			        '<h4 class="modal-title"></h4>'+
			    '</div>'+
			    '<div class="modal-body">'+
				    '<div class="panel panel-scrollable">'+
						'<div class="panel-body" style="overflow: hidden; outline: none;"></div>'+
					'</div>'+
			    '</div>'+
			    '<div class="modal-footer">'+
			    	'<button type="button" class="btn" role="cancel"></button>'+
			        '<button type="button" class="btn" role="ok"></button>'+
			    '</div>'+
			'</div>'+
		'</div>'+
	'</div>';

$.dialog.alert = function(options){
	var msghtml = $.dialog.msghtml;
	
	$msgbox = $(msghtml);
	$msgbox.find('button[role=cancel]').remove();
	$(document.body).append($msgbox);
	$msgbox.dialog('alert', options);
};
$.dialog.confirm = function(options){
	var msghtml = $.dialog.msghtml;
	
	$msgbox = $(msghtml);
	$(document.body).append($msgbox);
	$msgbox.dialog('confirm', options);
};

//=========================================================================
// 公共方法封装到jQuery对象中（$对象中）
// @author Abdiweli 2015-09-29
//=========================================================================
/*
|  方法名称										| 描述							| 参数
|===========================================================================================================================================================================|
|  01. $.sdpCommonFn.bulidData					| SINFO数据处理器				| data（SINFO格式数据）																		|
|  02. $.sdpCommonFn.getDataGridData			| 解析SINFO，获取Datagrid数据	| data（SINFO格式数据）																		|	
|  03. $.sdpCommonFn.getComboGridData			| 解析SINFO，获取Combogrid数据	| data（SINFO格式数据）																		|	
|  04. $.sdpCommonFn.getChartData				| 解析SINFO，获取eChart组件数据	| data（SINFO格式数据）																		|
|  05. $.sdpCommonFn.getComboBoxData			| 解析SINFO，获取Combox数据		| data（SINFO格式数据）																		|
|  06. $.sdpCommonFn.getComboTreeData			| 解析SINFO，获取ComboTree数据	| data（SINFO格式数据）																		|
|  07. $.sdpCommonFn.ztreeDataFilter			| 解析SINFO，获取zTree数据		| 																							|
|  08. $.sdpCommonFn.ztreeAsyncError			| 处理zTree异步数据加载异常		| 																							|
|  09. $.sdpCommonFn.exceptionHandler			| AJAX请求异常处理通用方法		    | _errorObject（异常信息对象，包含异常代码、异常内容、堆栈信息）							|
|  10. $.sdpCommonFn.alertMessage				| 弹出提示信息					| _msg（提示信息内容）																		|
|  11. $.sdpCommonFn.alertError					| 弹出警告信息					| _title（标题）,_msg（内容）, _timeOut（关闭时间）											|
|===========================================================================================================================================================================|
*/
$.sdpCommonFn = {
	/**
	 * SINFO数据处理器
	 * 用途：解析SINFO数据结构并返回里面的真实数据部分，如果是后台异常数据、则弹出异常信息
	 */
	bulidData : function(data) {
		if(data && data['schema'] == 'DATA'){
			// 如果带message属性，则先弹出消息
			if(data['data']['message'] != undefined && data['data']['message'] != null && data['data']['message'] !== '') {
				var msg_data = new Object();
				msg_data.schema = 'MSG';
				msg_data.data = new Object();
				msg_data.data.dataType = 'MODEL';
				msg_data.data.message = data['data']['message'];
				msg_data.data.model = null;
				
				$.sdpCommonFn.bulidData(msg_data);
			}
			
			if(data['data']['dataGrid'] || data['data']['dataType'] === 'DATA_GRID') {
				// Datagrid数据解析
				return $.sdpCommonFn.getDataGridData(data);
			}else if(data['data']['treeGrid'] || data['data']['dataType'] === 'TREE_GRID'){
				// Treegrid数据解析
				return $.sdpCommonFn.getTreeGridData(data);
			}else if(data['data']['comboBox'] || data['data']['dataType'] === 'COMBO_BOX'){
				// ComboBox数据解析
				return $.sdpCommonFn.getComboBoxData(data);
			}else if(data['data']['ztree']){
				// zTree数据解析
				return data['data']['ztree'];
			}else if(data['data']['comboTree'] || data['data']['dataType'] === 'COMBO_TREE'){
				// ComboTree数据解析
				return $.sdpCommonFn.getComboTreeData(data);
			}else if(data['data']['comboGrid'] || data['data']['dataType'] === 'COMBO_GRID'){
				// ComboGrid数据解析
				return $.sdpCommonFn.getComboGridData(data);
			} else if(data['data']['echart']){
				// eCahrt图标数据解析
				return $.sdpCommonFn.getChartData(data);
			} else if(data['data']['dataType'] === 'MODEL'){
				// eCahrt图标数据解析
				return data['data']['model'];
			}  else {
				// 数据格式错误，返回NULL
				return null;
			}
		} else if(data && data['schema'] == 'MSG') {
			// 弹出消息
			$.sdpCommonFn.alertMessage(data['data']['message']);
			// 如果附带数据字段，则返回
			if(data['data']['model']) {
				return data['data']['model'];
			}else {
				return null;
			}
		} else if(data && data['schema'] == 'ALL') {
			// 分解数据
			if(data['data'] && data['data']['dataType'] == 'MODEL') {
				var new_data = new Object();
				new_data.schema = 'MSG';
				new_data.data = data['data'];
				
				return $.sdpCommonFn.bulidData(new_data);
			}else if(data['data'] && data['data']['dataType']) {
				var new_data = new Object();
				new_data.schema = 'DATA';
				new_data.data = data['data'];
				
				return $.sdpCommonFn.bulidData(new_data);
			}else {
				return data;
			}
		} else {
			return data;
		}
	},
	
	/**
	 * Datagrid 组件数据处理
	 */
	getDataGridData : function(_data) {
		var temp = new Object();
		var data = _data['data']['dataGrid'] ? _data['data']['dataGrid'] : _data['data']['model'];
		temp.rows = data['rows'];
		temp.total = data['total'] ? data['total'] : temp.rows.length;

		if(data['footer']) {
			temp.footer = data['footer'];
		}
		
		return temp;
	},
	getComboGridData : function(_data){
		var temp = new Object();
		var data = _data['data']['comboGrid'] ? _data['data']['comboGrid'] : _data['data']['model'];
		temp.rows = data['rows'];
		temp.total = data['total'] ? data['total'] : temp.rows.length;
		if(data['footer']) {
			temp.footer = data['footer'];
		}
		return temp;
	},
	/**
	 * Treegrid 组件数据处理
	 */
	getTreeGridData : function(_data) {
		var temp = new Object();
		var data = _data['data']['treeGrid'] ? _data['data']['treeGrid'] : _data['data']['model'];
		temp.rows = data['rows'];
		temp.total = data['total'] ? data['total'] : temp.rows.length;
		
		if(data['footer']) {
			temp.footer = data['footer'];
		}
		
		return temp;
	},
	/**
	 * Echart组件数据处理
	 */
	getChartData:function(data){
		return data['data']['echart'];
	},
	
	/**
	 * ComboBox 组件数据处理
	 */
	getComboBoxData : function(data) {
		return data['data']['comboBox'];
	},
	
	getComboTreeData : function(data) {
		return data['data']['comboTree'];	
	},
	ztreeDataFilter:function(treeId,parentId,data){
		return data['data']['ztree'];
	},
	ztreeAsyncError:function(event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) {
		// 获取异常返回值
		var responseText = XMLHttpRequest.responseText;
		if(responseText !== '') {
			try {
				// 解析成JSON对象
				var errorObject = $.parseJSON($.trim(responseText));
				// 处理异常信息
				if(errorObject && (errorObject.messageCode || errorObject.messageContent)) {
					$.sdpCommonFn.exceptionHandler(errorObject);
				}
			}catch(e) {
				$.sdpCommonFn.alertError("警告", "JSON对象解析失败！<br />错误原因：" + e, false);
			}
		}else {
			$.sdpCommonFn.alertError("警告", "网络异常，请联系管理员！", false);
		}
	},
	treeGridDataFilter: function(data, parentId){
		var options = $(this).treegrid('options');
        var cusOtpions = options.customAttr;
        
        if(cusOtpions && cusOtpions.parentField){
            var idField = options.idField,
                parentField = cusOtpions.parentField,
                leafField = cusOtpions.leafField;
            
            for(var i=0, len=data.rows.length; i<len; i++){
            	if(data.rows[i][leafField] != 0 && data.rows[i][leafField] != false) {
            		data.rows[i]['state'] = 'open';
            	}else {
            		data.rows[i]['state'] = 'closed';
            	}
                if(data.rows[i][parentField] && data.rows[i][parentField] != 'root' && data.rows[i][idField] != data.rows[i][parentField]){
                    data.rows[i]['_parentId'] = data.rows[i][parentField];
                }else{
                    delete data.rows[i][parentField];
                }
            }
        }
        
        return data;
	},
	exceptionHandler : function(_errorObject) {
		if(_errorObject.stackInfo == undefined) {
			// 显示一般错误信息
			$.sdpCommonFn.alertError(_errorObject.messageCode, _errorObject.messageContent, false);
		}else {
			// 显示带堆栈信息的错误
			var cacheId = _errorObject.messageCode + '_' + (new Date().getTime());
			var msg = _errorObject.messageContent ? _errorObject.messageContent + '<br />' : '';
			msg += '<a href="javascript:void(0);" onclick="showStackTrace(\'' + cacheId + '\')">查看堆栈信息</a>';
			// 堆栈信息缓存到页面，以便点击【查看堆栈信息】链接时显示
			$('body').data(cacheId, _errorObject.stackInfo);
			$.sdpCommonFn.alertError(_errorObject.messageCode, msg, false);
		}
	},
	
	/**
	 * 弹出提示信息
	 */
	alertMessage : function(_msg) {
		$.notification.success({title:"提示", text:_msg, timeout:1500, icon:true, layout:'bottomRight'});
	},
	
	/**
	 * 弹出错误信息
	 */
	alertError : function(_title, _msg, _timeOut) {
		//屏蔽所有的错误提示。如“网络错误，请联系管理员”。by：陈明松
		//$.notification.error({title:_title ? _title : "警告", text:_msg, timeout: _timeOut === false ? false : 1500, icon:true, layout:'bottomRight'});
	}
};

//=========================================================================
// EasyUI组件loader方法的重载
// 用于解析后台返回的 SINFO 数据和异常数据
// 实例：
/*
	$("#dg").datagrid({
		method:'get',
		url:"/static/showcase/js/datagrid_data1.json",
		loader:$.easyuiloader
		...
	});
*/
// @author Abdiweli 2015-09-20
//=========================================================================
$.easyuiloader = function(param, success, error) {
	var that = $(this);
	var componentType = '';
	
	for(var i=0; i < $.parser.plugins.length; i++){
		var name = $.parser.plugins[i];
		if(this.className.indexOf(name) > -1) {
			componentType = name;
			break;
		}
	}
	
	var opts = that[componentType]("options");
	
	if(opts.treeField != undefined && opts.treeField != '') {
		opts = that.treegrid("options");
	}
	
	if (!opts.url) {
		return false;
	}
	
	$.ajax({
		type : opts.method,
		url : opts.url,
		data : param,
		dataType : "json",
		success : function (data) {
			// 处理SINFO数据
			success($.sdpCommonFn.bulidData(data));
		},
		error : function (XMLHttpRequest, textStatus, errorThrown) {
			// 获取异常返回值
			var responseText = XMLHttpRequest.responseText;
			if(responseText !== '') {
				try {
					// 解析成JSON对象
					var errorObject = $.parseJSON($.trim(responseText));
					// 处理异常信息
					if(errorObject && (errorObject.messageCode || errorObject.messageContent)) {
						$.sdpCommonFn.exceptionHandler(errorObject);
					}
				}catch(e) {
					$.sdpCommonFn.alertError("警告", "JSON对象解析失败！<br />错误原因：" + e, false);
				}
			}else {
				$.sdpCommonFn.alertError("警告", "网络异常，请联系管理员！", false);
			}
			success(null);
		}
	});
};

//=========================================================================
// 对话框中显示堆栈信息（在 $.sdpCommonFn.exceptionHandler 方法中使用）
// 参数：_cacheId 堆栈信息缓存ID（后台返回堆栈信息后缓存到页面上，用户点击查看时再读取）
//=========================================================================
function showStackTrace(_cacheId) {
	var exception = $('body').data(_cacheId);
	
	$.dialog.alert({
		'title': '堆栈信息', 
		'content': exception,
		'dialogSize': 'lg',
		'dialogType': 'danger',
		'scrollable': true
	});
}

//=========================================================================
// 重新封装的jQuery AJAX方法
// 用于解析后台返回的 SINFO 数据和异常信息
// 
// 实例：
// $.sdpAjax({url:'xxxx', success:function(){}, error:function(){}});
// @author Abdiweli 2015-09-29
//=========================================================================
$.sdpAjax = function(param) {
	// 默认参数
	var defaultConfig = {
	    type: "POST",
	    dataType: "JSON",
	    async: true,
	    error: function(XMLHttpRequest, textStatus, errorThrown) {
	    	$.loading('hide');
	    	// 获取异常返回值
			var responseText = XMLHttpRequest.responseText;
			if(responseText !== '') {
				try {
					// 解析成JSON对象
					var errorObject = $.parseJSON($.trim(responseText));
					// 处理异常信息
					if(errorObject && (errorObject.messageCode || errorObject.messageContent)) {
						$.sdpCommonFn.exceptionHandler(errorObject);
					}
				}catch(e) {
					$.sdpCommonFn.alertError("警告", e, false);
				}
			}else {
				$.sdpCommonFn.alertError("警告", "网络异常，请联系管理员！", false);
			}
	    }
	};
	
	// 与传入的参数合并
	var config = $.extend(true, {}, defaultConfig, param);
	
	/**
	 * 发起AJAX请求
	 */
	$.ajax({
	    url: config.url,
	    type: config.type,
	    data: config.data,
	    dataType: config.dataType,
	    async: config.async,
	    beforeSend: config.beforeSend,
	    success: function(data) {
	    	config.success($.sdpCommonFn.bulidData(data));
	    },
	    error: function(XMLHttpRequest, textStatus, errorThrown) {
	    	config.error(XMLHttpRequest, textStatus, errorThrown);
	    }
	});
};

//=========================================================================
// Loading加载效果
//
// 实例：
// $.loading('show', {imgSrc:'loading.gif', message:'正在上传...'});
// $.loading('hide');
// @author Abdiweli 2015-10-10
// 
//=========================================================================
// 公共方法
//=========================================================================
/*
|  方法名称						| 描述							| 参数
|===========================================================================================================================================================================|
|  01. show						| 显示Loading加载效果			| {imgSrc:'图片路径', message:'文字提示', alt:'鼠标悬停时的提示信息'}										|
|  02. hide						| 隐藏Loading加载效果			| 无																										|	
|===========================================================================================================================================================================|
*/
$.loading = function(type, param) {
	// 内部方法
	var methods = {
		show : function(param) {
			// 合并默认参数和传入的参数
			var options = $.extend({}, defaults, param);
			// 替换模板中内容
			var html = template.replace('{ALT}', options.alt);
			html = html.replace('{IMG_SRC}', options.imgSrc);
			html = html.replace('{MESSAGE}', options.message);
			
			$("#loading").remove();
			$("body").append(html);
		},
		hide : function() {
			$("#loading").remove();
		}
	};
	
	// 模板
	var template = 
		'<div id="loading">'+
		    '<div class="loading-inner">'+
				'<img alt="{ALT}" src="{IMG_SRC}">{MESSAGE}'+
			'</div>'+
		'</div>';
	
	// 默认参数
	var defaults = {
		imgSrc : UI.ROOT_PATH + "/static/core/images/general/1.gif",
		alt : '正在加载...',
		message : '正在加载...'
	};
	
	if(typeof(type) === "string") {
		methods[type](param);
	}
};

/**
 * 表单加载数据
 * target 表单jQuery对象
 * data 要加载的数据
 */
$.formLoader = function(target, data){
	
	if(typeof data == 'object') {
		_load(data);
	}else if(typeof data == 'string'){
		
		try{
			if($(data).find('PRE')){
				data = $(data).find('PRE').prevObject[0].innerHTML;
			}
			data = JSON.parse(data);
		}catch(e){
			console.log(e);
		}
		_load(data);
	}else {
		$.sdpCommonFn.alertError("警告", "数据格式有误！", false);
	}
	
	function _load(data){
		var form = $(target);
		for(var name in data){
			var val = data[name];
			var element = form.find('[name="'+name+'"]');
			
			if(element.is('input[type=text]') || element.is('textarea') || element.is('select') || element.is('input[type=hidden]')) {
				if(element.is('[multiple]')) {
					var valArr = val.split(",");
					for(var i = 0, len = valArr.length; i < len; i++) {
						element.find('option[value=' + valArr[i] + ']').attr('selected', 'selected');
						element.find('option:contains(' + valArr[i] + ')').attr('selected', 'selected');
					}
				}else {
					element.val(val);
				}
				if(element.is('.chosen-select')) {
					element.trigger("chosen:updated");
				}
			}else if(element.is('input[type=radio]')) {
				element.each(function(){
					if($(this).is('[value=' + val + ']')){
						$(this).prop('checked', true);
					}
				});
			}else if(element.is('input[type=checkbox]')) {
				var vals = val.split(",");
				$.each(vals, function(i,val){
					if(element.find("[value='"+val+"']"))
						element.prop('checked', true);
					else
						element.prop('checked', false);
				});
			}
		}
	}
};
